/*
    created: 2023/4/12
    filename: seqqueue.c
    author: 李东霖
    purpose: 循环顺序队列的实现 采用静态数组
    备注：这里牺牲一个存储单元来区分队满和队空
*/

#include"seqqueue.h"
//初始化 失败返回NULL 成功返回一个SqQueue*
SqQueue* InitQueue1()
{
    PSqQueue q = (PSqQueue)malloc(sizeof(SqQueue));
    ClearQueue(q);

}
//初始化    失败q=NULL 成功q=SqQueue*
int InitQueue2(PSqQueue *q)
{
    if(*q != NULL) return -1; 
    *q = (PSqQueue)malloc(sizeof(SqQueue));
    if(*q == NULL) return 0;
    ClearQueue(*q);   
    return 1;
}
//销毁队列  
void DestroyQueue(PSqQueue *q)
{
    if(*q == NULL) return;
    free(*q);
    *q = NULL;
}  
//清空队列  
void ClearQueue(PSqQueue q)
{
    if(q == NULL) return;
    q->front = 0;
    q->rear = 0;
    memset(q->data,0,sizeof(ElemType)*MAXSIZE);
    
}
//判断队列是否为空  返回值：-1-传入空指针 0-非空 1-空
int QueueEmpty(PSqQueue q)
{
    if(q == NULL) return -1;
    if(q->front == q->rear) return 1;
    return 0;
} 
//入队 返回值：-1-传入空指针 0-失败 1-成功
int enQueue(PSqQueue q,ElemType *e)
{
    if(NULL == q || e == NULL) return -1;
    if(1==QueueFull(q)) return 0;
    
    memcpy(q->data+q->rear,e,sizeof(ElemType));
    // printf("%d,%d",q->front,q->rear);
    q->rear=(q->rear+1)%MAXSIZE;  // 队尾指针后移。
    return 1;
} 
//出队 -1-传入空指针 0-失败 1-成功
int deQueue(PSqQueue q,ElemType *e)
{
    if(q == NULL) return -1;
    if(1 == QueueEmpty(q)) return 0;
    memcpy(e,q->data+q->front,sizeof(ElemType)); 
    q->front = (q->front+1)%MAXSIZE;   
    return 1;
} 
//判断队列是否满 返回值：-1-传入空指针 0-非空 1-空
int QueueFull(PSqQueue q)
{
    if(q == NULL) return -1;
    if((q->rear+1)%MAXSIZE == q->front) return 1;
    return 0;
}   
//得到队头 -1-传入空指针 0-失败 1-成功
int GetHeadQueue(PSqQueue q,ElemType *e)
{
    if(q == NULL) return -1;
    if(1 == QueueEmpty(q)) return 0;
    memcpy(e,q->data+q->front,sizeof(ElemType));  
    return 1;

}
//得到队列的长度 -1-传入空指针 >=0 队列长度
int LengthQueue(PSqQueue q)
{
    if(q == NULL) return -1;
    return (q->rear-q->front+MAXSIZE)%MAXSIZE;
}
//打印队列  
void DispQueue(PSqQueue q)
{
    if(q == NULL) return;
    for(int i = 0; i != LengthQueue(q);++i)
    {
        printf("%d  ",*(q->data+(q->front+i)%MAXSIZE));
    }
}